package pe.com.bbva.mantenimiento.action;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.mantenimiento.bo.BinBO;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.bo.TipoTarjetaBO;
import pe.com.bbva.mantenimiento.domain.Bin;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.mantenimiento.domain.TipoTarjeta;
import pe.com.bbva.util.Constantes;
import pe.com.bbva.util.SelectItem;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("tipoTarjetaAction")
@Scope("prototype")
@Results({
	@Result(name="viewListTipoTarjeta", type = "tiles", location = "viewListTipoTarjeta"),
	@Result(name="viewFormTipoTarjeta", type = "tiles", location = "viewFormTipoTarjeta"),
	@Result(name="listaTipos", type = "json", params = { "root", "grid" }),
})
public class TipoTarjetaAction extends GenericAction {
	private static final long serialVersionUID = 1L;
	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private TipoTarjetaBO tipoTarjetaBO;

	@Resource
	private BinBO binBO;
	
	@Resource
	private TablaBO tablaBO;

	private Long idTipoTarjeta;
	private TipoTarjeta tipoTarjeta;
	private TipoTarjeta tipoTarjetaBuscar;

	private List<SelectItem> itemCodBin;
	private List<SelectItem> itemCodTarjeta;
	private List<SelectItem> itemTamano;

	private List<SelectItem> itemCodBinEd;
	private List<SelectItem> itemCodTarjetaEd;
	private List<SelectItem> itemTamanoEd;
	
	private String codigoAnterior;

	@Action(value = "initTipoTarjeta")
	public String init() {
		tipoTarjeta = new TipoTarjeta();
		return "viewListTipoTarjeta";
	}

	@Action(value = "findAllTipoTarjeta")
	public String findAll() {
		try {
			if (tipoTarjetaBuscar == null) {
				tipoTarjetaBuscar = new TipoTarjeta();
			}
			setGrid(tipoTarjetaBO.findToGrid(tipoTarjetaBuscar, getSidx() + " " + getSord(), getPage(), getRows()));
			if (getGrid().getRecords().equals(new Integer(0))) {
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaTipos";
	}
	
	@Action(value = "newTipoTarjeta")
	public String newForm() {
		tipoTarjeta = new TipoTarjeta();
		return "viewFormTipoTarjeta";
	}
	
	@Action(value="updateTipoTarjeta")
	public String updateForm() {
		try {
			tipoTarjeta = tipoTarjetaBO.findById(idTipoTarjeta);
			codigoAnterior = tipoTarjeta.getCodTipoTarjeta();
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormTipoTarjeta";
	}

	@Action(value="deleteTipoTarjeta")
	public String delete() {
		try {
			tipoTarjetaBO.deleteLog(TipoTarjeta.class, idTipoTarjeta);
			addActionMessage("Eliminado Correctamente.");
		} catch (BOException e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewListTipoTarjeta";
	}

	@Action(value = "saveTipoTarjeta")
	public String save() throws BOException, DAOException {
		String forward = "";
		String mensaje = "";
		if (tipoTarjeta.getId() == null) {
			mensaje = "Registrado Correctamente";
		} else {
			mensaje = "Actualizado Correctamente";
		}
		try {
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(tipoTarjeta, usuarioSession);
			tipoTarjetaBO.save(tipoTarjeta, codigoAnterior);
			addActionMessage(mensaje);
			forward="viewListTipoTarjeta";
		} catch (BOException e) {
			tipoTarjeta = new TipoTarjeta();
			forward = "viewFormTipoTarjeta";
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			tipoTarjeta = new TipoTarjeta();
			forward = "viewFormTipoTarjeta";
			logger.error(StringUtil.getStackTrace(e));
		}
		return forward;
	}

	public Long getIdTipoTarjeta() {
		return idTipoTarjeta;
	}

	public void setIdTipoTarjeta(Long idTipoTarjeta) {
		this.idTipoTarjeta = idTipoTarjeta;
	}

	public TipoTarjeta getTipoTarjeta() {
		return tipoTarjeta;
	}

	public void setTipoTarjeta(TipoTarjeta tipoTarjeta) {
		this.tipoTarjeta = tipoTarjeta;
	}

	public TipoTarjeta getTipoTarjetaBuscar() {
		return tipoTarjetaBuscar;
	}

	public void setTipoTarjetaBuscar(TipoTarjeta tipoTarjetaBuscar) {
		this.tipoTarjetaBuscar = tipoTarjetaBuscar;
	}

	public List<SelectItem> getItemCodBin() throws BOException, DAOException {
		itemCodBin = new ArrayList<SelectItem>();
		itemCodBin.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION_TODOS));
		List<Bin> listAux = binBO.findBins(new Bin());
		for (Bin bin: listAux) {
			itemCodBin.add(new SelectItem(bin.getId().toString(), bin.getCodigo()));
		}
		return itemCodBin;
	}

	public void setItemCodBin(List<SelectItem> itemCodBin) {
		this.itemCodBin = itemCodBin;
	}

	public List<SelectItem> getItemCodTarjeta() throws BOException, DAOException {
		itemCodTarjeta = new ArrayList<SelectItem>();
		itemCodTarjeta.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION_TODOS));
		List<Tabla> listAux = tablaBO.findHijos(Constantes.ID_TABLA_COD_TARJETA);
		for (Tabla tabla : listAux) {
			itemCodTarjeta.add(new SelectItem(tabla.getId().toString(), tabla.getCodigo()));
		}
		return itemCodTarjeta;
	}

	public void setItemCodTarjeta(List<SelectItem> itemCodTarjeta) {
		this.itemCodTarjeta = itemCodTarjeta;
	}

	public List<SelectItem> getItemTamano() throws BOException, DAOException {
		itemTamano = new ArrayList<SelectItem>();
		itemTamano.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION_TODOS));
		List<Tabla> listAux = tablaBO.findHijos(Constantes.ID_TABLA_TAMANIO);
		for (Tabla tabla : listAux) {
			itemTamano.add(new SelectItem(tabla.getId().toString(), tabla.getDescripcion()));
		}
		return itemTamano;
	}

	public void setItemTamano(List<SelectItem> itemTamano) {
		this.itemTamano = itemTamano;
	}

	public List<SelectItem> getItemCodBinEd() throws BOException, DAOException {
		itemCodBinEd = new ArrayList<SelectItem>();
		itemCodBinEd.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION));
		List<Bin> listAux = binBO.findBins(new Bin());
		for (Bin bin: listAux) {
			itemCodBinEd.add(new SelectItem(bin.getId().toString(), bin.getCodigo()));
		}
		return itemCodBinEd;
	}

	public void setItemCodBinEd(List<SelectItem> itemCodBinEd) {
		this.itemCodBinEd = itemCodBinEd;
	}

	public List<SelectItem> getItemCodTarjetaEd() throws BOException, DAOException {
		itemCodTarjetaEd = new ArrayList<SelectItem>();
		itemCodTarjetaEd.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION));
		List<Tabla> listAux = tablaBO.findHijos(Constantes.ID_TABLA_COD_TARJETA);
		for (Tabla tabla : listAux) {
			itemCodTarjetaEd.add(new SelectItem(tabla.getId().toString(), tabla.getCodigo()));
		}
		return itemCodTarjetaEd;
	}

	public void setItemCodTarjetaEd(List<SelectItem> itemCodTarjetaEd) {
		this.itemCodTarjetaEd = itemCodTarjetaEd;
	}

	public List<SelectItem> getItemTamanoEd() throws BOException, DAOException {
		itemTamanoEd = new ArrayList<SelectItem>();
		itemTamanoEd.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION));
		List<Tabla> listAux = tablaBO.findHijos(Constantes.ID_TABLA_TAMANIO);
		for (Tabla tabla : listAux) {
			itemTamanoEd.add(new SelectItem(tabla.getId().toString(), tabla.getDescripcion()));
		}
		return itemTamanoEd;
	}

	public void setItemTamanoEd(List<SelectItem> itemTamanoEd) {
		this.itemTamanoEd = itemTamanoEd;
	}

	public void setCodigoAnterior(String codigoAnterior) {
		this.codigoAnterior = codigoAnterior;
	}

	public String getCodigoAnterior() {
		return codigoAnterior;
	}
}